package main

import (
	"fmt"
)

//接口VS继承2
//实现接口可以看作是对继承的一种补充
//接口和继承解决的问题不同：
//***继承的价值：主要在于解决代码的复用性和可维护性
//***接口的价值：主要在于设计，设计好各种规范（方法），让其他自定义类型去实现这些方法；
//接口在一定程度上实现代码解耦
//接口比继承更加灵活

func main() {
	//接口多态数组！！！！  只要实现了该接口，就可以存入数组~~无论什么类型~~~~
	var usbArr [3]USB
	usbArr[0] = Phone{"小米"}
	usbArr[1] = Phone{"vivo"}
	usbArr[2] = Camera{"尼康"}
	fmt.Println("UsbArr: ", usbArr)
}

type USB interface { //接口的定义
	Start() //接口的两个方法！
	Stop()
}
type USB2 interface { //接口的定义  由于与USB有一样的方法，所以下面的结构体同时也实现了USB2
	Start() //接口的两个方法！
	Stop()
}
type Phone struct {
	name string
}

//让该结构体Phone实现接口的方法
func (p Phone) Start() {
	fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
	fmt.Println("手机停止工作...")
}

type Camera struct {
	name string
}

//让该结构体Camera实现接口的方法
func (c Camera) Start() {
	fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
	fmt.Println("相机停止工作...")
}

//计算机
type Computer struct {
}

//编写一个方法，可以接收USB接口类型的的参数
//只要实现了USB接口的方法，“也就是说实现了USB接口声明的【所有】方法”
func (c Computer) Working(usb USB) { //体现出了多态
	//通过接口变量来调用Start和Stop接口的方法
	usb.Start()
	usb.Stop()
}
